package pers.qianyu.module.core.util;

import com.google.common.collect.Sets;
import com.hankcs.hanlp.corpus.tag.Nature;
import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.IndexTokenizer;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 分词工具
 *
 * @author mizzle rain
 * @date 2021-03-17 12:31
 */
public class TokenizerUtil {
    private static final Set<Nature> NATURES = Sets.newHashSet(
            //名词
            Nature.n,
            //人名
            Nature.nr,
            //日语人名
            Nature.nrj,
            //音译人名
            Nature.nrf,
            //复姓
            Nature.nr1,
            //蒙古姓名
            Nature.nr2,
            //地名
            Nature.ns,
            //音译地名
            Nature.nsf,
            //机构团体名
            Nature.nt,
            //公司名
            Nature.ntc,
            //工厂
            Nature.ntcf,
            //银行
            Nature.ntcb,
            //酒店宾馆
            Nature.ntch,
            //政府机构
            Nature.nto,
            //大学
            Nature.ntu,
            //中小学
            Nature.nts,
            //医院
            Nature.nth,
            //医药疾病等健康相关名词
            Nature.nh,
            //药品
            Nature.nhm,
            //疾病
            Nature.nhd,
            //工作相关名词
            Nature.nn,
            //职务职称
            Nature.nnt,
            //职业
            Nature.nnd,
            //名词性语素
            Nature.ng,
            //食品，比如“薯片”
            Nature.nf,
            //机构相关（不是独立机构名）
            Nature.ni,
            //教育相关机构
            Nature.nit,
            //下属机构
            Nature.nic,
            //机构后缀
            Nature.nis,
            //物品名
            Nature.nm,
            //化学品名
            Nature.nmc,
            //生物名
            Nature.nb,
            //动物名
            Nature.nba,
            //动物纲目
            Nature.nbc,
            //植物名
            Nature.nbp,
            //其他专名
            Nature.nz,
            //学术词汇
            Nature.g,
            //数学相关词汇
            Nature.gm,
            //物理相关词汇
            Nature.gp,
            //化学相关词汇
            Nature.gc,
            //生物相关词汇
            Nature.gb,
            //生物类别
            Nature.gbc,
            //地理地质相关词汇
            Nature.gg,
            //计算机相关词汇
            Nature.gi,
            //简称略语
            Nature.j,
            //成语
            Nature.i,
            //习用语
            Nature.l,
            //时间词
            Nature.t,
            //时间词性语素
            Nature.tg,
            //处所词
            Nature.s,
            //方位词
            Nature.f,
            //动词
            Nature.v,
            //副动词
            Nature.vd,
            //名动词
            Nature.vn,
            //趋向动词
            Nature.vf,
            //形式动词
            Nature.vx,
            //不及物动词（内动词）
            Nature.vi,
            //动词性惯用语
            Nature.vl,
            //动词性语素
            Nature.vg,
            //形容词
            Nature.a,
            //副形词
            Nature.ad,
            //名形词
            Nature.an,
            //形容词性语素
            Nature.ag,
            //形容词性惯用语
            Nature.al,
            //区别词
            Nature.b,
            //区别词性惯用语
            Nature.bl,
            //状态词
            Nature.z,
            //代词性语素
            Nature.rg,
            //古汉语代词性语素
            Nature.Rg,
            //数词
            Nature.m,
            //数量词
            Nature.mq,
            //甲乙丙丁之类的数词
            Nature.Mg,
            //量词
            Nature.q,
            //动量词
            Nature.qv,
            //副词
            Nature.d,
            //拟声词
            Nature.o,
            //字符串
            Nature.x
    );

    public static Set<String> splitKeyWords(String keywords) {
        List<Term> termList = IndexTokenizer.segment(keywords);
        return termList.stream()
                .filter(t -> NATURES.contains(t.nature))
                .map(t -> t.word)
                .collect(Collectors.toSet());
    }
}
